/**
 * @file custom.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include <stdio.h>
#include "lvgl.h"
#include "custom.h"
#include "meter.h"
#include "dlight_bh1750.h"

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

/**********************
 *  STATIC VARIABLES
 **********************/

/**
 * Create a demo application
 */

void custom_init(lv_ui *ui)
{
	/* Add your codes here */
}


/**
 * @brief 当测光模式更新时，禁止、使能相应的控件
 * 切记，只有当UI界面是测光界面才能调用这个函数，否则可能遇到野指针跑飞。
 *
 * @param ui
 */
void custom_meter_update_mode_widgets(lv_ui* ui)
{
	switch (meter_mode_get()) {
		case METER_MODE_AV: {
			lv_label_set_text(guider_ui.screen_lightmeter_btn_mode_value_label, "AV");
			// 光圈优先模式下，快门速度不能调整
			// 光圈调节按键使能
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_ap_minus, LV_STATE_DEFAULT);
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_ap_plus, LV_STATE_DEFAULT);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_ap_minus, LV_STATE_DISABLED);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_ap_plus, LV_STATE_DISABLED);

			// 快门调节按键禁止
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_sp_minus, LV_STATE_DISABLED);
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_sp_plus, LV_STATE_DISABLED);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_sp_minus, LV_STATE_DEFAULT);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_sp_plus, LV_STATE_DEFAULT);
		}
		break;

		case METER_MODE_TV: {
			lv_label_set_text(guider_ui.screen_lightmeter_btn_mode_value_label, "TV");
			// 快门优先模式下，光圈不能调整
			// 快门调节按键使能
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_sp_minus, LV_STATE_DEFAULT);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_sp_minus, LV_STATE_DISABLED);
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_sp_plus, LV_STATE_DEFAULT);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_sp_plus, LV_STATE_DISABLED);

			// 光圈调节按键禁止
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_ap_minus, LV_STATE_DISABLED);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_ap_minus, LV_STATE_DEFAULT);
			lv_obj_add_state(guider_ui.screen_lightmeter_btn_ap_plus, LV_STATE_DISABLED);
			lv_obj_clear_state(guider_ui.screen_lightmeter_btn_ap_plus, LV_STATE_DEFAULT);
		}
		break;

		default:
		break;
	}

	// 第一次更新 ISO, AV, TV 档位显示控件
	lv_label_set_text(guider_ui.screen_lightmeter_lbl_iso_value, (const char*)iso_get_string());
	lv_label_set_text(guider_ui.screen_lightmeter_lbl_ap_value, (const char*)av_get_string());
	lv_label_set_text(guider_ui.screen_lightmeter_lbl_sp_value, (const char*)tv_get_string());
}

/**
 * @brief 在当前测光模式下，根据 lux 和 ev0 计算其他的组件数值
 *
 * @param ui
 */
void custom_meter_update_widgets(lv_ui* ui)
{
	double ev0 = calc_ev_by_lux(bh1750_get_lux());
	uint32_t iso = (uint32_t)iso_get_val();

	switch (meter_mode_get()) {
		case METER_MODE_AV: { // 光圈优先，计算快门速度
			uint32_t av = (uint32_t)av_get_val();
			uint32_t sp_idx = calc_shutter_speed(ev0, iso, av);

			tv_set_idx(sp_idx);

			// 更新 GUI 控件
			lv_label_set_text(ui->screen_lightmeter_lbl_sp_value, (const char*)tv_get_string());
		}
			break;

		case METER_MODE_TV: { // 快门优先，计算光圈大小
			uint32_t sp = (uint32_t)tv_get_val();
			uint32_t av_idx = calc_aperture(ev0, iso, sp);

			// 更新光圈大小到变量
			av_set_idx(av_idx);

			// 更新 GUI 组件
			lv_label_set_text(ui->screen_lightmeter_lbl_ap_value, (const char*)av_get_string());
			break;
		}

	default:
		break;
	}
}
